package bin_tree.heap.leetcode;

import java.util.*;

/**
 * 前k个和最小的数对
 * @author zerorain
 * @date 2022/03/03 19:51
 **/
public class Num373 {
    private class Pair {
        int u;
        int v;
        public Pair(int u, int v) {
            this.u = u;
            this.v = v;
        }
    }
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        // 1.扫描这两个数组，u来自第一个数组，v这个元素来自于第二个数组
        // 最大堆<Pair>，此时元素的大小关系为pair对象中u + v的值越大认为元素越大
        Queue<Pair> queue = new PriorityQueue<>(new Comparator<Pair>() {
            @Override
            public int compare(Pair o1, Pair o2) {
                return (o2.u + o2.v) - (o1.u + o1.v);
            }
        });
        // 2.遍历两个数组，u来自于第一个数组，v来自于第二个数组
        for (int i = 0; i < Math.min(nums1.length,k); i++) {
            for (int j = 0; j < Math.min(nums2.length,k); j++) {
                if (queue.size() < k) {
                    queue.offer(new Pair(nums1[i],nums2[j]));
                }else {
                    int add = nums1[i] + nums2[j];
                    Pair pair = queue.peek();
                    if (add > (pair.u + pair.v)) {
                        continue;
                    }else {
                        queue.poll();
                        queue.offer(new Pair(nums1[i],nums2[j]));
                    }
                }
            }
        }
        // 此时优先级队列中就存储了和最小的前k个pair对象
        List<List<Integer>> ret = new ArrayList<>();
        for (int i = 0; i < k && (!queue.isEmpty()); i++) {
            List<Integer> temp = new ArrayList<>();
            Pair pair = queue.poll();
            temp.add(pair.u);
            temp.add(pair.v);
            ret.add(temp);
        }
        return ret;
    }
}